USB Device 升级(onebin)
1. 简介¶
1.1. 升级方式类别¶
-
空片 模式 usb device升级
-
uboot 模式 usb device 升级
-
kernel模式 usb device 升级(uvc模式)
-
kernel 模式 usb device 升级 (U盘模式)
1.2. 测试环境¶
pcb:ssd212 demo board
内核配置:pioneer3_spinand_defconfig
project配置:dispcam_p3_spinand.glibc-9.1.0-s01a.64.qfn128.demo_defconfig
usbtool:usbdownloadtool 2.1
2. 空片 模式 usb device升级¶
需求场景:已有完整pcb,有usb 接口,但是nandflash或norflash里面为空。
实现原理:IC上电先执行rom code,然后根据外部硬件配置跳转到nandflash/norflash中执行IPL,没有找到IPL资料,系统自动进入ufu的升级模式。通过pc tool 预加载u-boot.bin。
此模式下要求:预加载的u-boot.bin 本身具备ufu升级能力。
操作步骤:
-
uboot配置
将编译生成的u-boot_spinand.img.bin 或u-boot.img.bin 重新命名u-boot.bin (仅仅用作空片引导)。下面操作流程会用到此文件。
-
按正常流程编译整包sdk,生成image升级文件。
-
下载工具包(此处nandflash为例) 这里需要针对bulid的不同flash使用不同的工具包(相应的sdk中tools包含升级工具):
SPINOR FLASH升级工具包:usbloadertool_onebin_spinor_20210104.rar
SPINAND FLASH升级工具包:usbloadertool_onebin_spinand_20210104.rar.rar
将对应的工具包解压到image路径下。
-
将生成的u-boot.bin替换到此处。
-
空片模式上电,接入usb。可以观察到pc上有接入存储设备
-
执行USBDownloadTool.exe , 正常情况下如图。
通常系统正常升级后,可通过串口可以观察开机过程。
3. uboot 模式 usb device 升级介绍¶
需求场景:已有完整pcb,有usb 接口,确保系统可进入uboot模式
实现原理: norflash或nandfash里面已经有uboot。且此份uboot支持device模式下接pc升级,通过执行uboot和pc软件进行交互,完成下载升级
此模式下要求:uboot 本身具备ufu升级能力。
操作步骤:
-
配置uboot
支持ufu升级,但是不开启自动运行。
-
将uboot烧录入flash。此boot具有ufu升级能力。
如果需要在uboot来使用usb device升级功能。
需要在boot模式下设定如下参数,开机会进入device升级模式。
setenv ota_upgrade_status 1 saveenv
-
下载工具包(此处nandflash为例)
这里需要针对bulid的不同flash使用不同的工具包(相应的sdk中tools包含升级工具)
SPINOR FLASH升级工具包:usbloadertool_onebin_spinor_20210104.rar
SPINAND FLASH升级工具包:usbloadertool_onebin_spinand_20210104.rar.rar
将对应的工具包解压到image路径下
-
重新上电开机后,系统进入如下。
-
执行USBDownloadTool.exe 开始升级
4. kernel模式 usb device 升级(uvc模式)¶
此处分为两部分:内核配置和应用程序
实现原理:板端会配置为uvc模式。通过应用pc tool下命令到板端的应用程序。之后设置环境变量,最终利用uboot下的ufu升级功能完成升级。
在验证kernel下的usb 升级的时候,首先要确保uboot下可以正常使用usb device升级。
此模式要求:
0:uboot支持ufu升级。参考uboot 模式 usb device 升级介绍
1:内核配置uvc模式
2:需要有应用程序mi_uvc
3:USBDownloadTool升级到2.1.
4.1. 内核配置¶
在现有配置基础上增加uvc的配置可以通过以下两种方式:
-
直接修改当前平台的默认配置。(推荐)
添加以下配置:
CONFIG_MEDIA_SUPPORT=m CONFIG_MEDIA_CAMERA_SUPPORT=y CONFIG_MEDIA_CONTROLLER=y CONFIG_VIDEO_DEV=m CONFIG_VIDEO_V4L2=m CONFIG_VIDEOBUF2_CORE=m CONFIG_VIDEOBUF2_MEMOPS=m CONFIG_VIDEOBUF2_VMALLOC=m CONFIG_MEDIA_SUBDRV_AUTOSELECT=y CONFIG_USB_GADGET=m CONFIG_USB_GADGET_VBUS_DRAW=2 CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS=2 CONFIG_USB_GADGET_SSTAR_DEVICE=m CONFIG_USB_AVOID_SHORT_PACKET_IN_BULK_OUT_WITH_DMA_FOR_ETHERNET=y CONFIG_USB_LIBCOMPOSITE=m CONFIG_SS_GADGET=m CONFIG_USB_F_UVC=m CONFIG_USB_G_WEBCAM=m CONFIG_USB_WEBCAM_UVC=y CONFIG_MULTI_STREAM_FUNC_NUM=1
-
使用当前平台的默认配置
make pioneer3_xxxx_defconfig
添加配置:make menuconfig
-
media 框架配置
-> Device Drivers -> Multimedia support -> Device Drivers -> Multimedia support -> Cameras/video grabbers support -> Device Drivers -> Multimedia support -> Media Controller API
输出模块: media.ko videodev.ko v4l2-common.ko
-
-
usb Gadget 框架配置
-> Device Drivers -> USB support -> Device Drivers -> USB support -> USB Gadget Support 输出模块:usb-common.ko udc-core.ko
-
udc 驱动配置:该模块为硬件ip相关模块,视具体情况进行配置
-> Device Drivers -> USB support -> USB Gadget Support -> USB Peripheral Controller -> Sstar USB 2.0 Device Controller
输出模块:udc-msb250x.ko
-
-
gadget webcam
-> Device Drivers -> USB support -> USB Gadget Support -> USB Gadget Drivers -> Device Drivers -> USB support -> USB Gadget Support -> USB Gadget Drivers -> USB Webcam Gadget -> Device Drivers -> USB support -> USB Gadget Support -> USB Peripheral Controller -> Sstar USB 2.0 Device Controller -> Avoid short packet in bulk out with DMA for ethernet 输出模块:libcomposite.ko、 videobuf2-core.ko、 videobuf2-v4l2.ko、 videobuf2-memops.ko、 videobuf2-vmalloc.ko 、usb_f_uvc.ko g_webcam.ko
project配置,因目前没有添加UVC相关配置,所以编译uvc功能时需手动修改以下两个文件:
-
若是在kernel配置中使用方式二配置则需修改project/makefile文件,注释掉image目标下的$(MAKE) linux-kernel,以免重新编译kernel覆盖了之前手动编译的kernel;
-
project/kbuild/customize/4.9.84/p3/dispcam/kernel_mod_list_late文件,修改为内容:
media.ko videodev.ko v4l2-common.ko usb-common.ko #usbcore.ko #ehci-hcd.ko #scsi_mod.ko #usb-storage.ko videobuf2-core.ko videobuf2-v4l2.ko videobuf2-memops.ko videobuf2-vmalloc.ko udc-core.ko libcomposite.ko usb_f_uvc.ko udc-msb250x.ko g_webcam.ko streaming_maxpacket=3072 streaming_maxburst=13 uac_function_enable=0
4.2. 应用程序¶
源码参考 myuvc_remove_media.zip
应用程序编译(略)
应用端执行程序 mi_uvc
核心代码:
case UVC_SET_CUR: if (cfg->bCmdCap & CAP_SET_CUR_CMD) { UVC_INFO("/etc/fw_setenv ota_upgrade_status 1\n"); system("/etc/fw_setenv ota_upgrade_status 1"); system("sleep 1"); system("reboot"); if (cfg->bInfoCap & INFO_AUTO_MODE_SUPPORT) { } } else { goto invalid_req; }
操作流程:
参考上述的方式编译kernel,更新 image后执行应用程序。
接入usb 到pc 后,执行USBDownloadTool.exe。板端收到uvc的cmd后,会重新设置env自动重启进入uboot升级模式。
重新点击“upgrade firmware”,正式进入升级状态。
5. kernel 模式 usb device 升级 (U盘模式)¶
需求场景:没有使用uvc场景下。例如:u盘模式
实现原理: 默认情况下, USBDownloadTool 还是首先检测 device是不是 uvc,如果是 uvc, 就跟上面 uvc 升级步骤一模一样; 如果不是 uvc, 才会使用到扩展升级。 为了支持扩展升级, USBDownloadTool 将会通过 EP0 下发自定义的 setup command 来取代 XU command, 通知板子进行升级。( 注: 特殊的 setup command 已添加到 usb gadget driver 中, 须更新到相应版本, 才能进行升级。注意此文件composite.c 有更新)
此模式要求:
0:uboot本身具有ufu升级能力。
1:kernel 支持 u 盘模式。
2:USBDownloadTool升级到2.1.
配置方式:
-
uboot 配置,参考上面:uboot 模式 usb device 升级介绍
-
kernel 支持usb device mass storage 功能
驱动配置方法:
-
usb Gadget 框架配置
-> Device Drivers -> USB support -> Device Drivers -> USB support -> USB Gadget Support
输出模块:usb-common.ko udc-core.ko
-
配置支持configfs
-> Device Drivers -> USB Gadget Support -> USB functions configurable through configfs
如果配置成模块,需要安装对应驱动:libcomposite.ko
-
芯片ip相关驱动
例如:USB device2.0 驱动
-> Device Drivers -> USB support -> USB Gadget Support -> USB Peripheral Controller -> Sstar USB 2.0 Device Controller
生成驱动: udc-msb250x.ko
-
usb function相关驱动
需要到以下位置配置子选项:(需要处理 function 所需依赖问题)
-> Device Drivers -> USB support -> USB Gadget Support -> USB functions configurable through configfs
-
mass storage
-> Device Drivers -> USB support -> USB Gadget Support -> USB Gadget Drivers -> Mass Storage Gadget 生成模块:usb_f_mass_storage.ko
-
insmod ko
在project/kbuild/customize/4.9.84/p3/dispcam/kernel_mod_list_late修改为:
usb-common.ko udc-core.ko libcomposite.ko udc-msb250x.ko usb_f_mass_storage.ko
操作流程:
-
更新image
-
确认加载上面5个ko文件
-
执行脚本,配置u 盘参数
建立文件:dd if=/dev/zero of=/customer/disk.img bs=1M count=20
./usb_storage.sh
-
执行升级脚本
./fwupdated &
-
执行USBDownloadTool 2.1.exe
-
选择存储设备,点击ok。图中会显示升级过程,也可以通过串口观察
-
相关的配置和测试image,参考附件images-usbotg-storage.7z
-
6. 无法升级注意事项¶
-
首先确保空片下也可以正常升级,否则查硬件。
-
其次确保可以在uboot下完成升级。否则检查硬件和uboot配置
-
在kernel 模式下可以正常接收uvc tool的升级命令(可以重启进入uboot升级模式)。确保执行有执行mi_uvc
-
如果pc上检测到多个uvc设备,请禁用pc上camera设备。